use super::FudaThing;
use chrono::DateTime;
use chrono::Local;
use chrono::Utc;
use serde::Serialize;
use serde::Deserialize;
use surrealdb::sql::Thing;
use ts_rs::TS;
/// 通常，Level 2数据会包括多个价格层次的买卖盘口信息，这样可以帮助交易者更深入地理解市场的供需情况和潜在的价格动向。
/// 通常用于实时监控分析
///
#[derive(Debug, Serialize, Deserialize, Default, TS)]
#[ts(export)]
pub struct Tick {
    /// 唯一标识符，由security_id+tick_time组成唯一标识 e.g. SH.STOCK.600519.1709093447762
    #[ts(as = "Option<FudaThing>")]
    pub id: Option<Thing>,
    /// 股票代码 e.g. SH.KZZ.110052
    pub security_id: String,
    /// 交易时间戳（精确到毫秒）
    pub time: DateTime<Utc>,
    /// 成交价格
    pub price: f64,
    /// 成交量（股数）
    pub volume: u32,
    /// 成交笔数
    pub trade_count: u32,
    /// 主卖s1， 主买2，j竞价4
    pub s1b2j4: u32,

    /// 成交金额（总价）
    pub turnover: Option<f64>,
    /// 主动买价（买1价）
    pub ask1p: Option<f64>,
    /// 主动买量（买1量）
    pub ask1v: Option<f64>,
    /// 主动卖价（卖1价）
    pub bid1p: Option<f64>,
    /// 主动卖量（卖1量）
    pub bid1v: Option<f64>,

    /// 主动买价（买2价）
    pub ask2p: Option<f64>,
    /// 主动买量（买2量）
    pub ask2v: Option<f64>,
    /// 主动卖价（卖2价）
    pub bid2p: Option<f64>,
    /// 主动卖量（卖2量）
    pub bid2v: Option<f64>,

    /// 主动买价（买3价）
    pub ask3p: Option<f64>,
    /// 主动买量（买3量）
    pub ask3v: Option<f64>,
    /// 主动卖价（卖3价）
    pub bid3p: Option<f64>,
    /// 主动卖量（卖3量）
    pub bid3v: Option<f64>,

    /// 主动买价（买4价）
    pub ask4p: Option<f64>,
    /// 主动买量（买4量）
    pub ask4v: Option<f64>,
    /// 主动卖价（卖4价）
    pub bid4p: Option<f64>,
    /// 主动卖量（卖4量）
    pub bid4v: Option<f64>,

    /// 主动买价（买5价）
    pub ask5p: Option<f64>,
    /// 主动买量（买5量）
    pub ask5v: Option<f64>,
    /// 主动卖价（卖5价）
    pub bid5p: Option<f64>,
    /// 主动卖量（卖5量）
    pub bid5v: Option<f64>,

    /// 主动买价（买6价）
    pub ask6p: Option<f64>,
    /// 主动买量（买6量）
    pub ask6v: Option<f64>,
    /// 主动卖价（卖6价）
    pub bid6p: Option<f64>,
    /// 主动卖量（卖6量）
    pub bid6v: Option<f64>,

    /// 主动买价（买7价）
    pub ask7p: Option<f64>,
    /// 主动买量（买7量）
    pub ask7v: Option<f64>,
    /// 主动卖价（卖7价）
    pub bid7p: Option<f64>,
    /// 主动卖量（卖7量）
    pub bid7v: Option<f64>,

    /// 主动买价（买8价）
    pub ask8p: Option<f64>,
    /// 主动买量（买8量）
    pub ask8v: Option<f64>,
    /// 主动卖价（卖8价）
    pub bid8p: Option<f64>,
    /// 主动卖量（卖8量）
    pub bid8v: Option<f64>,

    /// 主动买价（买9价）
    pub ask9p: Option<f64>,
    /// 主动买量（买9量）
    pub ask9v: Option<f64>,
    /// 主动卖价（卖9价）
    pub bid9p: Option<f64>,
    /// 主动卖量（卖9量）
    pub bid9v: Option<f64>,

    /// 主动买价（买10价）
    pub ask10p: Option<f64>,
    /// 主动买量（买10量）
    pub ask10v: Option<f64>,
    /// 主动卖价（卖10价）
    pub bid10p: Option<f64>,
    /// 主动卖量（卖10量）
    pub bid10v: Option<f64>,
}

impl Tick {
    pub fn id_from(secuirty_id: &str, time: &DateTime<Local>) -> String {
        // Returns the number of non-leap seconds since January 1, 1970 0:00:00 UTC (aka "UNIX timestamp").
        let timestamp = time.timestamp();

        format!("{}_{}", secuirty_id, timestamp)
    }
}
